통계교육원 R 중급 통계분석
강의기간 : 2021. 6.28. ~ 2021. 6. 30.
주요 강의 내용
R 기초
dplyr 패키지를 이용한 자료 핸들링
기초 통계분석(t검정, 분산분석, 교차분석)
중급 통계분석(상관분석, 회귀분석)
분류모형 (로지스틱 회귀분석, 의사결정나무, 랜덤포레스트 등)
실제 데이터를 활용한 분석 실습
\(R\) 을 공부해야하는 다양한 이유가 있지만 몇가지 추리면 다음과 같다.
\(R\) is freely and easily accesible.
쉽게 접근할 수 있고 자유롭게 이용할 수 있다. 인터넷만 연결되어 있다면 사이트에서 다운 받아 설치하면 언제 어디서든지 사용할 수 있다. 또한 돈을 낼 필요 없는 공짜(freeware)이다.
For a software environment with a primarily statical focus.
통계분석을 목적으로 개발되어 많은 사용자들이 커뮤니티를 통해 정보를 주고 받고 있다. 사회과학, 자연과학, 의약학 등 많은 분야의 연구자들이 본인이 작성한 코드를 공유하며 서로의 지식을 발전시켜 나가고 있다.
\(R\) is open source.
R의 팩키지를 이용하면서 핵심 알고리즘이 궁금한 경우 소스코드를 다운로드받아 직접 확인할 수 있어 연구에 사용되는 함수의 이해도를 높일 수 있다.
\(R\) is reasonably fast in ordinary tasks.
다른 통계프로그램인 SPSS, Stats, SAS 등에 비해 계산시간이 빠르다. 심지어 Rcpp 패키지를 통해 C언어를 구현할 수 있어 다른 프로그램에 비해 상대적으로 계산시간을 단축시킬 수 있다.
\(R\) is powerful in creating data visualizations.
\(R\)은 자료 (data) 시각화를 쉽게 할 수 있다. 많은 양의 데이터를 시각화 한다면 데이터의 특징을 쉽게 이해하고 분석할 수 있다. R을 이용한 시각화에 관심이 있으면 https://www.r-graph-gallery.com/을 참고바란다. 아래 그림은 시계열 자료의 시각화 예이다. 다른 프로그램과 달리 상호교류가능한 (interactive) 그림을 그릴 수 있다.
Work in \(R\) is mainly command line based.
처음 프로그램 이용하는 사람에게 단점처럼 보이나 명령어 방식의 분석은 반복적인 분석을 수행하거나 재분석을 수행할때 엄청난 장점이 된다.
\(R\) is not picky about operating systems.
요즘 프로그램처럼 \(R\)은 윈도우, 맥, 리눅스와 같이 운영체제에 구애받지 않고 돌아간다.
Finally, \(R\) is the entire package from start to finish.
통계분석(또는 데이터과학)의 프로그래밍은 일반적으로 다음 과정으로 진행된다.
Import : 자료 불러오기 (여러 유형의 자료 file, database, web API 등)
만약 자료를 불러오지 못한다면, 더이상 통계분석을 할 수 없습니다.
Tidy : 자료 정리하기
Import로 가져온 자료를 확인 (변수명, 자료의 수, 등) head, tail, dim, str, View, summary 등의 함수를 통해 확인
Transform : 자료 변환
필요한 변수와 자료 선택, 표준화 등 불러온 raw data를 분석하기 쉽게 재정리
Visualise : 시각화
통계 분석 전 결과가 어떻게 나올 것인지 탐색하는 단계
Model : 통계분석
통계적 가설을 세우고 통계적 가설검정
Communicate : 소통하기
R을 통해 분석한 결과를 보고서 또는 시각화하여 의사결정에 활용
1부터 6까지를 한꺼번에 R을 통해 처리할 수 있고 그 과정이 programming 됩니다.
R 의 기본 연산단위는 벡터이며, x <- c(1, 2, 3) 은 1,2,3 으로 이루어진 길이 3인 벡터를 x 에 저장한다. 대입연산자는 = 와 <- 둘 다 가능하지만 함수의 인자로도 쓰이는 = 와 구별하기 위해 <- 를 권장한다.
math <- c(70,80,90,80,60)
eng <- c(80,85,90,85,95)
math+eng
## [1] 150 165 180 165 155
math*eng
## [1] 5600 6800 8100 6800 5700
math %/% 10
## [1] 7 8 9 8 6
math %/% 10
## [1] 7 8 9 8 6
sqrt(math)
## [1] 8.366600 8.944272 9.486833 8.944272 7.745967
sum(math)
## [1] 380
diff(math)
## [1] 10 10 -10 -20
mean(math)
## [1] 76
var(math)
## [1] 130
sd(math)
## [1] 11.40175
median(math)
## [1] 80
range(math)
## [1] 60 90
IQR(math)
## [1] 10
max(math)
## [1] 90
which.min(math)
## [1] 5
length(math)
## [1] 5
벡터에서 특정 항목을 골라내기 위해선 중괄호[]를 이용하여 위치 혹은 조건문을 주면 된다.
math[2]
## [1] 80
math[-2]
## [1] 70 90 80 60
math[2:4]
## [1] 80 90 80
math[c(1,5,3)]
## [1] 70 60 90
math>75
## [1] FALSE TRUE TRUE TRUE FALSE
math[math>75]
## [1] 80 90 80
math[math %in% c(80, 90)]
## [1] 80 90 80
if (test_expression) {
statement
}
for(values in 1:10)
{if (values <= 10)
print(paste(values, "is less than or equal to 10"))
}
## [1] "1 is less than or equal to 10"
## [1] "2 is less than or equal to 10"
## [1] "3 is less than or equal to 10"
## [1] "4 is less than or equal to 10"
## [1] "5 is less than or equal to 10"
## [1] "6 is less than or equal to 10"
## [1] "7 is less than or equal to 10"
## [1] "8 is less than or equal to 10"
## [1] "9 is less than or equal to 10"
## [1] "10 is less than or equal to 10"
for(values in 1:10)
{if (values <= 5)
print(paste(values, "is less than or equal to 5"))
}
## [1] "1 is less than or equal to 5"
## [1] "2 is less than or equal to 5"
## [1] "3 is less than or equal to 5"
## [1] "4 is less than or equal to 5"
## [1] "5 is less than or equal to 5"
if (test_expression) {
statement
} else {
statement
}
x <- -4
if(x > 0) # 조건을 만족하지 않으므로 else문이 실행됩니다.
{ print("양수입니다.")
} else {
print("양수가 아닙니다.")
}
## [1] "양수가 아닙니다."
아래와 같이 사용하면 오류가 발생하고 실행되지 않습니다.
x <- -4
if(x > 0) # 조건을 만족하지 않으므로 아래의 문장이 실행되지 않습니다.
print("양수입니다.")
} else
{print("양수가 아닙니다.")}
하지만 아래와 같이 else 다음에 한줄로 된 코드를 입력하면 문제 없이 실행됩니다.
x <- -4
if(x > 0) # 조건을 만족하지 않으므로 아래의 문장이 실행되지 않습니다.
{ print("양수입니다.")
} else print("양수가 아닙니다.")
## [1] "양수가 아닙니다."
if ( test_expression1) {
statement1
} else if ( test_expression2) {
statement2 } else if ( test_expression3) {
statement3
} else {
statement4
}
x <- 0
if (x < 0) {
print("Negative number")
} else if (x > 0) {
print("Positive number")
} else
print("Zero")
## [1] "Zero"
values <- c(1,7,5,3,9)
for(id in 1:5){
print(values[id])
}
Q1. if와 for를 이용하여 50부터 100까지 6의 배수의 합을 구하여라.
sum=0
for(i in 50:100){
if(i %% 6==0) sum=sum+i
}
print(sum)
## [1] 600
Q2. 2,5,3,9,8,11,6에서 짝수의 갯 수를 if와 for 문으로 구하여라.
x <- c(2,5,3,9,8,11,6)
count <- 0
for (val in x) {
if(val %% 2 == 0) count = count+1
}
print(count)
## [1] 3
연습 : 10!을 계산하세요.
## [1] 3628800
이제 실제 자료를 읽고 확인하는 방법입니다.
자료를 불러오기 전에 미리 작업폴더를 R에서 지정하면 그 다음부터 편하게 작업하실 수 있습니다.
getwd()함수를 사용하면 현재 작업중인 폴더를 확인할 수 있습니다.
getwd()
## [1] "C:/Users/stats/Documents/R 중급강좌 (통계교육원)/Day1"
setwd()함수를 사용하면 원하는 위치로 작업폴더를 설정할 수 있어 자료를 쉽게 불러올 수 있습니다.
setwd("c:/")
getwd()
## [1] "c:/"
여기서 주의해야할 부분은 폴더구분을 / 또는 ’\’로 해야합니다. R은 유닉스 기반으로 구축되어 윈도우에서 사용하는 \를 위치로 인식하지 못하기 때문입니다.
R의 데이터는 가급적이면 csv로 만들어서 불러오는게 편합니다. csv(comma seperated variables) 용량이 작고 어떤 소프트웨어에서도 쉽게 사용할 수 있기 때문입니다. 한글이 포함된 엑셀, SPSS, SAS파일를 R에서 불러올 경우 encoding 에러가 발생할 수 있으니 주의가 필요합니다.
ex <- read.csv("C:/Users/stats/Documents/R 중급강좌 (통계교육원)/Day1/diet.csv")
head(ex)
## Person gender Age Height pre.weight Diet weight6weeks
## 1 25 NA 41 171 60 2 60.0
## 2 26 NA 32 174 103 2 103.0
## 3 1 0 22 159 58 1 54.2
## 4 2 0 46 192 60 1 54.0
## 5 3 0 55 170 64 1 63.3
## 6 4 0 33 171 64 1 61.1
엑셀파일은 readxl 팩키지 그리고 SAS나 SPSS는 foreign 혹은 haven 패키지를 이용하면 불러오고 저장할 수 있다.
library(readxl)
ex_excel <- read_excel("C:/Users/stats/Documents/R 중급강좌 (통계교육원)/Day1/diet.xlsx")
library(haven)
## Warning: package 'haven' was built under R version 4.0.5
# write_sas(ex, "example.sas7bdat")
# write_sav(ex, "example.sav")
# ex_sas <- read_sas("example.sas7bdat")
# ex.spss <- read_sav("example.sav")
데이터를 import 한 후에는 데이터가 잘 불러와졌는지 꼭 확인해야합니다.
head(ex)
## Person gender Age Height pre.weight Diet weight6weeks
## 1 25 NA 41 171 60 2 60.0
## 2 26 NA 32 174 103 2 103.0
## 3 1 0 22 159 58 1 54.2
## 4 2 0 46 192 60 1 54.0
## 5 3 0 55 170 64 1 63.3
## 6 4 0 33 171 64 1 61.1
tail(ex)
## Person gender Age Height pre.weight Diet weight6weeks
## 73 73 1 40 179 79 3 74.5
## 74 74 1 35 183 83 3 80.2
## 75 75 1 49 177 84 3 79.9
## 76 76 1 28 164 85 3 79.7
## 77 77 1 40 167 87 3 77.8
## 78 78 1 51 175 88 3 81.9
head(ex,10)
## Person gender Age Height pre.weight Diet weight6weeks
## 1 25 NA 41 171 60 2 60.0
## 2 26 NA 32 174 103 2 103.0
## 3 1 0 22 159 58 1 54.2
## 4 2 0 46 192 60 1 54.0
## 5 3 0 55 170 64 1 63.3
## 6 4 0 33 171 64 1 61.1
## 7 5 0 50 170 65 1 62.2
## 8 6 0 50 201 66 1 64.0
## 9 7 0 37 174 67 1 65.0
## 10 8 0 28 176 69 1 60.5
str(ex)
## 'data.frame': 78 obs. of 7 variables:
## $ Person : int 25 26 1 2 3 4 5 6 7 8 ...
## $ gender : int NA NA 0 0 0 0 0 0 0 0 ...
## $ Age : int 41 32 22 46 55 33 50 50 37 28 ...
## $ Height : int 171 174 159 192 170 171 170 201 174 176 ...
## $ pre.weight : int 60 103 58 60 64 64 65 66 67 69 ...
## $ Diet : int 2 2 1 1 1 1 1 1 1 1 ...
## $ weight6weeks: num 60 103 54.2 54 63.3 61.1 62.2 64 65 60.5 ...
names(ex)
## [1] "Person" "gender" "Age" "Height" "pre.weight"
## [6] "Diet" "weight6weeks"
dim(ex)
## [1] 78 7
ncol(ex)
## [1] 7
nrow(ex)
## [1] 78
summary(ex)
## Person gender Age Height
## Min. : 1.00 Min. :0.0000 Min. :16.00 Min. :141.0
## 1st Qu.:20.25 1st Qu.:0.0000 1st Qu.:32.25 1st Qu.:164.2
## Median :39.50 Median :0.0000 Median :39.00 Median :169.5
## Mean :39.50 Mean :0.4342 Mean :39.15 Mean :170.8
## 3rd Qu.:58.75 3rd Qu.:1.0000 3rd Qu.:46.75 3rd Qu.:174.8
## Max. :78.00 Max. :1.0000 Max. :60.00 Max. :201.0
## NA's :2
## pre.weight Diet weight6weeks
## Min. : 58.00 Min. :1.000 Min. : 53.00
## 1st Qu.: 66.00 1st Qu.:1.000 1st Qu.: 61.85
## Median : 72.00 Median :2.000 Median : 68.95
## Mean : 72.53 Mean :2.038 Mean : 68.68
## 3rd Qu.: 78.00 3rd Qu.:3.000 3rd Qu.: 73.83
## Max. :103.00 Max. :3.000 Max. :103.00
##
데이터의 열에 해당하는 변수는 특수문자 $를 이용하여 확인할 수 있습니다.
혹은 중괄호[]를 이용해서도 확인하실 수 있습니다.
두개 이상의 변수를 한번에 선택하기 위해선 c()함수를 이용하면 됩니다.
ex$gender
## [1] NA NA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [26] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
## [51] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [76] 1 1 1
ex[,2]
## [1] NA NA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [26] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
## [51] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [76] 1 1 1
ex[,c(1,4,6)]
## Person Height Diet
## 1 25 171 2
## 2 26 174 2
## 3 1 159 1
## 4 2 192 1
## 5 3 170 1
## 6 4 171 1
## 7 5 170 1
## 8 6 201 1
## 9 7 174 1
## 10 8 176 1
## 11 9 165 1
## 12 10 165 1
## 13 11 173 1
## 14 12 156 1
## 15 13 163 1
## 16 14 167 1
## 17 27 174 2
## 18 28 172 2
## 19 29 165 2
## 20 30 171 2
## 21 31 169 2
## 22 32 174 2
## 23 33 163 2
## 24 34 173 2
## 25 35 166 2
## 26 36 163 2
## 27 37 165 2
## 28 38 167 2
## 29 39 161 2
## 30 40 169 2
## 31 52 165 3
## 32 53 169 3
## 33 54 159 3
## 34 55 169 3
## 35 56 160 3
## 36 57 169 3
## 37 58 163 3
## 38 59 155 3
## 39 60 141 3
## 40 61 170 3
## 41 62 170 3
## 42 63 171 3
## 43 64 171 3
## 44 65 153 3
## 45 66 157 3
## 46 15 168 1
## 47 16 158 1
## 48 17 173 1
## 49 18 160 1
## 50 19 162 1
## 51 20 165 1
## 52 21 177 1
## 53 22 166 1
## 54 23 166 1
## 55 24 190 1
## 56 41 191 2
## 57 42 199 2
## 58 43 196 2
## 59 44 190 2
## 60 45 160 2
## 61 46 194 2
## 62 47 163 2
## 63 48 171 2
## 64 49 198 2
## 65 50 180 2
## 66 51 182 2
## 67 67 155 3
## 68 68 179 3
## 69 69 166 3
## 70 70 173 3
## 71 71 177 3
## 72 72 179 3
## 73 73 179 3
## 74 74 183 3
## 75 75 177 3
## 76 76 164 3
## 77 77 167 3
## 78 78 175 3
ex[1:5,c(1,4,6)]
## Person Height Diet
## 1 25 171 2
## 2 26 174 2
## 3 1 159 1
## 4 2 192 1
## 5 3 170 1